```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SQL查询结果处理最佳实践 | 技术小馆</title>
    <link href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <link href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            background-color: #f8fafc;
            color: #1e293b;
        }
        .hero-gradient {
            background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
        }
        .code-block {
            background-color: #1e293b;
            border-radius: 0.5rem;
            box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
        }
        .card-hover {
            transition: all 0.3s ease;
        }
        .card-hover:hover {
            transform: translateY(-5px);
            box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
        }
        .highlight {
            position: relative;
        }
        .highlight:after {
            content: '';
            position: absolute;
            bottom: 2px;
            left: 0;
            width: 100%;
            height: 8px;
            background-color: rgba(167, 139, 250, 0.3);
            z-index: -1;
            transition: all 0.2s ease;
        }
        .highlight:hover:after {
            height: 14px;
            background-color: rgba(167, 139, 250, 0.5);
        }
    </style>
</head>
<body>
    <!-- Hero Section -->
    <section class="hero-gradient text-white py-20 px-4 md:px-0">
        <div class="container mx-auto max-w-5xl flex flex-col items-center text-center">
            <div class="w-16 h-16 bg-white rounded-full flex items-center justify-center mb-6">
                <i class="fas fa-database text-3xl text-indigo-600"></i>
            </div>
            <h1 class="text-4xl md:text-5xl font-bold mb-6 font-serif">SQL查询结果处理最佳实践</h1>
            <p class="text-xl md:text-2xl text-indigo-100 max-w-3xl leading-relaxed">
                掌握MyBatis中处理多行与单行查询结果的优雅方式，提升Java数据库操作效率与代码可读性
            </p>
        </div>
    </section>

    <!-- Main Content -->
    <main class="container mx-auto max-w-5xl px-4 md:px-0 py-16">
        <!-- Intro Section -->
        <section class="mb-20">
            <p class="text-lg text-slate-600 mb-8 leading-relaxed">
                在Java应用中使用MyBatis进行数据库操作时，正确处理SQL查询结果是至关重要的。根据查询返回的数据量不同（单行或多行），我们需要采用不同的接收方式。本文将详细介绍这些最佳实践，并探讨动态表查询及Map的使用场景。
            </p>
            
            <div class="bg-white rounded-xl shadow-lg p-6 mb-8 card-hover">
                <h2 class="text-2xl font-bold mb-4 text-slate-800 flex items-center">
                    <i class="fas fa-lightbulb text-yellow-400 mr-3"></i>
                    <span class="highlight">核心原则</span>
                </h2>
                <p class="text-slate-600 mb-4">
                    在MyBatis中处理查询结果时，遵循以下原则可以编写出更加健壮和可维护的代码：
                </p>
                <ul class="list-disc pl-6 text-slate-600 space-y-2">
                    <li>当SQL查询返回<strong class="text-indigo-600">多行数据</strong>时，使用<code class="bg-slate-100 px-2 py-1 rounded">List&lt;T&gt;</code>接收</li>
                    <li>当SQL查询返回<strong class="text-indigo-600">单行数据</strong>时，可以直接使用实体类或单值接收</li>
                    <li>对于<strong class="text-indigo-600">动态表结构查询</strong>，可以使用<code class="bg-slate-100 px-2 py-1 rounded">List&lt;Map&lt;String, Object&gt;&gt;</code>处理</li>
                    <li>Map可以作为轻量级的对象替代方案，特别适用于动态字段场景</li>
                </ul>
            </div>
        </section>

        <!-- Code Examples Section -->
        <section class="mb-20">
            <h2 class="text-3xl font-bold mb-8 text-slate-800 font-serif border-b pb-4">代码示例</h2>
            
            <!-- Multi-row Query -->
            <div class="grid md:grid-cols-2 gap-8 mb-12">
                <div>
                    <h3 class="text-xl font-bold mb-4 text-slate-700 flex items-center">
                        <i class="fas fa-list-ol text-indigo-500 mr-2"></i>
                        多行查询处理
                    </h3>
                    <p class="text-slate-600 mb-4">
                        当查询可能返回多行数据时，使用<code class="bg-slate-100 px-1 py-0.5 rounded">List&lt;T&gt;</code>作为返回类型。这是MyBatis中最常见的多行结果处理方式。
                    </p>
                    <div class="code-block p-6 rounded-lg">
                        <pre class="text-gray-300 text-sm overflow-x-auto"><code>@Select("select * from t_User")
public List&lt;User&gt; getUserList();

// 动态查询，查询的表是动态设置的，有可能是t_user,t_emp,t_dept
@Select("select * from ${tname}")
public List&lt;Map&lt;String,Object&gt;&gt; getList(String tname);</code></pre>
                    </div>
                </div>
                <div class="flex items-center">
                    <div class="bg-indigo-50 p-6 rounded-lg border border-indigo-100">
                        <h4 class="font-bold text-indigo-700 mb-3 flex items-center">
                            <i class="fas fa-info-circle mr-2"></i>
                            技术说明
                        </h4>
                        <ul class="text-slate-600 text-sm space-y-2">
                            <li>• 第一个示例查询固定表<code class="bg-indigo-100 px-1 py-0.5 rounded text-indigo-800">t_User</code>，返回用户对象列表</li>
                            <li>• 第二个示例展示动态表名查询，使用<code class="bg-indigo-100 px-1 py-0.5 rounded text-indigo-800">${tname}</code>语法</li>
                            <li>• 动态查询返回<code class="bg-indigo-100 px-1 py-0.5 rounded text-indigo-800">Map</code>集合，因为表结构不确定</li>
                            <li>• 注意SQL注入风险，动态表名应确保来源可信</li>
                        </ul>
                    </div>
                </div>
            </div>

            <!-- Map Usage -->
            <div class="grid md:grid-cols-2 gap-8">
                <div class="order-2 md:order-1 flex items-center">
                    <div class="bg-amber-50 p-6 rounded-lg border border-amber-100">
                        <h4 class="font-bold text-amber-700 mb-3 flex items-center">
                            <i class="fas fa-lightbulb mr-2"></i>
                            Map使用场景
                        </h4>
                        <ul class="text-slate-600 text-sm space-y-2">
                            <li>• 当对象属性不固定时，Map比POJO更灵活</li>
                            <li>• 适合快速原型开发或简单的CRUD操作</li>
                            <li>• 减少DTO类的创建，降低代码复杂度</li>
                            <li>• 缺点是类型不安全，IDE无法提供代码补全</li>
                        </ul>
                    </div>
                </div>
                <div class="order-1 md:order-2">
                    <h3 class="text-xl font-bold mb-4 text-slate-700 flex items-center">
                        <i class="fas fa-map-marked-alt text-amber-500 mr-2"></i>
                        使用Map表示对象
                    </h3>
                    <p class="text-slate-600 mb-4">
                        在某些场景下，使用Map来表示对象比创建专门的POJO类更加方便，特别是当对象结构不固定或需要动态处理时。
                    </p>
                    <div class="code-block p-6 rounded-lg">
                        <pre class="text-gray-300 text-sm overflow-x-auto"><code>// 使用POJO表示对象
User user = new User();
user.setId(10);
user.setName("admin");

// 使用Map表示相同对象
Map&lt;String,Object&gt; user = new HashMap&lt;&gt;();
user.put("id", 10);  // key:属性名称，value:属性值
user.put("name", "admin");</code></pre>
                    </div>
                </div>
            </div>
        </section>

        <!-- Decision Diagram -->
        <section class="mb-20">
            <h2 class="text-3xl font-bold mb-8 text-slate-800 font-serif border-b pb-4">选择指南</h2>
            <p class="text-slate-600 mb-8 max-w-3xl leading-relaxed">
                不确定应该使用List、单值还是Map来处理查询结果？下面的流程图将帮助你根据具体场景做出最佳选择。
            </p>
            
            <div class="bg-white rounded-xl shadow-lg p-6 card-hover">
                <div class="mermaid">
                    graph TD
                        A[开始] --> B{查询返回多行数据?}
                        B -->|是| C{表结构是否固定?}
                        B -->|否| D[使用实体类或单值接收]
                        C -->|是| E[使用List<实体类>接收]
                        C -->|否| F[使用List<Map<String,Object>>接收]
                        D --> G[结束]
                        E --> G
                        F --> G
                </div>
            </div>
        </section>

        <!-- Best Practices -->
        <section>
            <h2 class="text-3xl font-bold mb-8 text-slate-800 font-serif border-b pb-4">最佳实践建议</h2>
            
            <div class="grid md:grid-cols-3 gap-6">
                <div class="bg-white p-6 rounded-xl shadow-md card-hover">
                    <div class="w-12 h-12 bg-indigo-100 rounded-full flex items-center justify-center mb-4">
                        <i class="fas fa-list-check text-indigo-600 text-xl"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-3 text-slate-700">类型安全优先</h3>
                    <p class="text-slate-600 text-sm">
                        在可能的情况下，优先使用强类型的POJO而不是Map，这样可以获得更好的类型安全和IDE支持。
                    </p>
                </div>
                
                <div class="bg-white p-6 rounded-xl shadow-md card-hover">
                    <div class="w-12 h-12 bg-blue-100 rounded-full flex items-center justify-center mb-4">
                        <i class="fas fa-shield-alt text-blue-600 text-xl"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-3 text-slate-700">防范SQL注入</h3>
                    <p class="text-slate-600 text-sm">
                        使用动态表名(<code class="bg-slate-100 px-1 py-0.5 rounded">${tname}</code>)时要特别小心，确保参数值可信，或使用白名单验证。
                    </p>
                </div>
                
                <div class="bg-white p-6 rounded-xl shadow-md card-hover">
                    <div class="w-12 h-12 bg-green-100 rounded-full flex items-center justify-center mb-4">
                        <i class="fas fa-layer-group text-green-600 text-xl"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-3 text-slate-700">合理使用Map</h3>
                    <p class="text-slate-600 text-sm">
                        Map适合原型开发或字段不固定的场景，但在正式项目中，应尽可能使用明确的DTO或VO。
                    </p>
                </div>
            </div>
        </section>
    </main>

    <!-- Footer -->
    <footer class="bg-slate-900 text-slate-400 py-12 px-4">
        <div class="container mx-auto max-w-5xl">
            <div class="flex flex-col md:flex-row justify-between items-center">
                <div class="mb-4 md:mb-0">
                    <h3 class="text-white text-lg font-medium mb-2">技术小馆</h3>
                    <p class="text-sm">分享前沿技术，传递开发智慧</p>
                </div>
                <div>
                    <a href="http://www.yuque.com/jtostring" class="text-slate-300 hover:text-white transition-colors duration-200 flex items-center">
                        <i class="fas fa-external-link-alt mr-2"></i>
                        http://www.yuque.com/jtostring
                    </a>
                </div>
            </div>
            <div class="border-t border-slate-700 mt-8 pt-8 text-center text-sm">
                <p>© 2023 技术小馆. 保留所有权利.</p>
            </div>
        </div>
    </footer>

    <script>
        mermaid.initialize({
            startOnLoad: true,
            theme: 'default',
            flowchart: {
                useMaxWidth: true,
                htmlLabels: true,
                curve: 'basis'
            }
        });
    </script>
</body>
</html>
```